package com.midian.common.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;

/**
 * 
 * @Title:工具类  
 * @Desription:集合工具类
 * @Company:MDKG
 * @ClassName:CollectionHelper.java
 * @Author:Mengfh
 * @CreateDate:2013-6-7 下午3:21:10  
 * @UpdateUser:Mengfh  
 * @Version:0.1
 */
public class CollectionHelper {
	/**
	 * 
	 * @ClassName: CollectionHelper.java
	 * @Description: 将一个List以指定数量进行分组
	 * @Author:Mengfh
	 * @CreateDate:2013-6-7 下午3:21:22
	 * @param resList 需要被划分的List
	 * @param separateCount 划分的个数
	 * @return
	 */
	public static <T> List<List<T>> separateListToGroup(List<T> resList, int separateCount) {
		if(resList == null || resList.isEmpty() || separateCount == 0) {
			return null;
		}
		//组集合
		List<List<T>> groupList = new ArrayList<List<T>>();
		//成员集合
		List<T> memberList = new ArrayList<T>();
		//需要被划分的List的成员个数
		int size = resList.size();
		for(int i = 1; i <= size; i++) {
			memberList.add(resList.get(i - 1));
			if(i % separateCount == 0) {
				//添加数量达到指定划分的个数，将这个成员集合放进组集合中，并新建一个成员集合
				groupList.add(memberList);
				memberList = new ArrayList<T>();
			} else if(i == size) {
				//总数或者剩余没有达到指定划分的个数，将这个成员集合放进组集合中
				groupList.add(memberList);
			}
		}
		return groupList;
	}
	
	/**
	 * 为目标集合填充元素并变成横向显示
	 * @param srcBigList 源集合
	 * @return
	 */
	public static <T> List<List<T>> fillAndChangerHorizontalForList(List<List<T>> srcBigList) {
		int maxCount = 0; //源集合元素的最大数量
		List<List<T>> targetBigList = new ArrayList<List<T>>(); //返回的结果集
		
		//获取每个列表元素的最大数量
		for (List<T> topInfoList : srcBigList) {
			if(topInfoList.size() > maxCount) {
				maxCount = topInfoList.size();
			}
		}
		
		//初始化目标结果集
		for (int i = 0; i < maxCount; i++) {
			List<T> topInfoList = new ArrayList<T>();
			targetBigList.add(topInfoList);
		}
		
		//在列表最后填补空行
		for (int i = 0; i < maxCount; i++) {
			for (int j = 0; j < srcBigList.size(); j++) {
				List<T> srcList = srcBigList.get(j); //源结果集
				List<T> targetList = targetBigList.get(i); //目标结果集
				
				//如果源集合在当前下标存在元素，则赋值给目标集合，否则填充空元素，直到每个集合填充到最大数量时结束
				if (srcList.size() > i) {
					//源结果集为纵向显示，而目标结果集要变为横向显示，
					//所以要将源结果集j列第i个元素放到目标结果i行下标为j的位置中
					targetList.add(srcList.get(i));
				} else {
					targetList.add(null); //填充空单元格
				}
			}
		}
		
		return targetBigList;
	}
	
	/**
	 * 处理列表中的子列表
	 * @param list 列表集合
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> getOpSubList(List<T> list) {
		List<T> targetList = new ArrayList<T>();
		try {
			Map<Integer, T> parentMap = new HashMap<Integer, T>();
			Map<Integer, List<T>> menuMap = new HashMap<Integer, List<T>>();
			for (T t : list) {
				Class<?> clazz = t.getClass();
				T parent = (T) clazz.getMethod("getParent").invoke(t);
				if(parent != null) {
					Object parentIdObj = parent.getClass().getMethod("getId").invoke(parent);
					Integer parentId = null;
					if(parentIdObj != null) {
						parentId = ((Number) parentIdObj).intValue();
					}
					if(parentId != null) {
						if(menuMap.containsKey(parentId)) {
							List<T> subMenuList = menuMap.get(parentId);
							subMenuList.add(t);
						} else {
							List<T> subMenuList = new ArrayList<T>();
							subMenuList.add(t);
							menuMap.put(parentId, subMenuList);
							parentMap.put(parentId, parent);
						}
					}
				} else {
					targetList.add(t);
				}
			}
			for(Entry<Integer, List<T>> entry : menuMap.entrySet()) {
				Integer parentId = entry.getKey();
				T parent = parentMap.get(parentId);
				List<T> subMenuList = entry.getValue();
				parent.getClass().getMethod("setChildren", List.class).invoke(parent, subMenuList);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return targetList;
	}
	
	/**
	 * 获取id列表
	 * @param ids id拼接字符串
	 * @return
	 */
	public static List<Integer> getIdList(String ids) {
		List<Integer> idList = new ArrayList<Integer>();
		if(StringUtils.isNotBlank(ids)) {
			String[] idStrArr = ids.split(",");
			for (String idStr : idStrArr) {
				idList.add(Integer.parseInt(idStr));
			}
		}
		return idList;
	}
}
